package Q17_21_Volume_of_Histogram;
public class QuestionB {
public static int borderedVolume(HistogramData[] data, int start, int end) {
if (start >= end) return 0;
int min = Math.min(data[start].getHeight(), data[end].getHeight());
int sum = 0;
for (int i = start + 1; i < end; i++) {
sum += min - data[i].getHeight();
}
return sum;
}
public static int subgraphVolume(HistogramData[] histogram, int start, int end, boolean isLeft) {
if (start >= end) return 0;
int sum = 0;
if (isLeft) {
int max = histogram[end - 1].getLeftMaxIndex();
sum += borderedVolume(histogram, max, end);
sum += subgraphVolume(histogram, start, max, isLeft);
} else {
int max = histogram[start + 1].getRightMaxIndex();
sum += borderedVolume(histogram, start, max);
sum += subgraphVolume(histogram, max, end, isLeft);
}
return sum;
}
public static HistogramData[] createHistogramData(int[] histo) {
HistogramData[] histogram = new HistogramData[histo.length];
for (int i = 0; i < histo.length; i++) {
histogram[i] = new HistogramData(histo[i]);
}
/* Set left max index. */
int maxIndex = 0;
for (int i = 0; i < histo.length; i++) {
if (histo[maxIndex] < histo[i]) {
maxIndex = i;
}
histogram[i].setLeftMaxIndex(maxIndex);
}
/* Set right max index. */
maxIndex = histogram.length - 1;
for (int i = histogram.length - 1; i >= 0; i--) {
if (histo[maxIndex] < histo[i]) {
maxIndex = i;
}
histogram[i].setRightMaxIndex(maxIndex);
}
return histogram;
}
public static int computeHistogramVolume(int[] histogram) {
int start = 0;
int end = histogram.length - 1;
HistogramData[] data = createHistogramData(histogram);
int max = data[0].getRightMaxIndex();
int leftVolume = subgraphVolume(data, start, max, true);
int rightVolume = subgraphVolume(data, max, end, false);
return leftVolume + rightVolume;
}
public static void main(String[] args) {
int[] histogram = {0, 0, 4, 0, 0, 6, 0, 0, 3, 0, 8, 0, 2, 0, 5, 2, 0, 3, 0, 0};
int result = computeHistogramVolume(histogram);
System.out.println(result);
}
}